package yiran.agift.manager;
import yiran.agift.AGift;
import java.sql.*;
import java.util.*;
public class MailboxManager {
    private final DatabaseManager dbManager;
    private final Map<Integer, String> giftNameCache = new HashMap<>();

    public MailboxManager() {
        dbManager = new DatabaseManager();
    }

    /**
     * 清除玩家的特定礼物
     * 通过玩家的UUID和礼物ID来定位并删除数据库中的对应记录
     *
     * @param playerUUID 玩家的唯一标识符
     * @param giftId 礼物的唯一标识符
     */
    public void clearGift(UUID playerUUID, int giftId) {
        // 定义SQL语句，用于从数据库中删除符合条件的记录
        String sql = "DELETE FROM mailboxes WHERE player_uuid = ? AND gift_id = ?";
        try (Connection conn = dbManager.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            // 设置PreparedStatement的参数，用于精确查询要删除的记录
            pstmt.setString(1, playerUUID.toString());
            pstmt.setInt(2, giftId);
            // 执行更新操作，删除符合条件的记录
            pstmt.executeUpdate();
        } catch (SQLException e) {
            // 打印异常信息，用于调试和错误追踪
            e.printStackTrace();
        }
    }

    /**
     * 将礼物发送到玩家的邮箱中
     * 此方法将玩家的UUID和礼物ID记录到数据库的mailbox表中，以表示玩家收到了一个礼物
     *
     * @param playerUUID 玩家的唯一标识符，用于在数据库中识别玩家
     * @param giftId 代表礼物的唯一标识符，用于在数据库中记录礼物信息
     */
    public void sendGiftToMailbox(UUID playerUUID, int giftId) {
        // SQL语句，用于向mailboxes表中插入玩家UUID和礼物ID
        String sql = "INSERT INTO mailboxes (player_uuid, gift_id) VALUES (?, ?)";
        try (Connection conn = dbManager.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            // 设置PreparedStatement参数，将玩家UUID和礼物ID绑定到SQL语句中
            pstmt.setString(1, playerUUID.toString());
            pstmt.setInt(2, giftId);
            // 执行SQL语句，完成礼物信息的插入
            pstmt.executeUpdate();
        } catch (SQLException e) {
            // 异常处理：打印SQL执行错误信息
            e.printStackTrace();
        }
    }

    /**
     * 根据玩家UUID获取玩家的邮箱中的礼包ID列表
     *
     * @param playerUUID 玩家的UUID，用于查询邮箱
     * @return 包含玩家邮箱中所有礼包ID的列表
     */
    public List<Integer> getPlayerMailbox(UUID playerUUID) {
        // 记录查询玩家邮箱的日志
        AGift.getInstance().getLogger().info("查询玩家邮箱: " + playerUUID);

        // 初始化用于存储礼包ID的列表
        List<Integer> giftIds = new ArrayList<>();

        // SQL查询语句，用于从数据库中获取玩家邮箱中的礼包ID
        String sql = "SELECT gift_id FROM mailboxes WHERE player_uuid = ?";

        try (Connection conn = dbManager.getConnection();
             PreparedStatement pstmt = conn.prepareStatement(sql)) {
            // 设置查询语句中的玩家UUID参数
            pstmt.setString(1, playerUUID.toString());

            // 执行查询并获取结果集
            ResultSet rs = pstmt.executeQuery();

            // 遍历结果集，获取并记录每个礼包ID
            while (rs.next()) {
                int giftId = rs.getInt("gift_id");
                giftIds.add(giftId);

                // 记录找到的礼包ID
                AGift.getInstance().getLogger().info("找到礼包: " + giftId);
            }
        } catch (SQLException e) {
            // 记录查询邮箱时发生的错误
            AGift.getInstance().getLogger().severe("查询邮箱错误: " + e.getMessage());
            e.printStackTrace();
        }

        // 返回包含所有礼包ID的列表
        return giftIds;
    }

    /**
     * 清空指定玩家的邮箱
     * 此方法通过删除数据库中与玩家UUID关联的所有邮件记录来实现
     *
     * @param playerUUID 玩家的唯一标识符UUID
     */
    public void clearMailbox(UUID playerUUID) {
        // 定义SQL语句，用于删除指定玩家UUID的邮箱记录
        String sql = "DELETE FROM mailboxes WHERE player_uuid = ?";
        try (
                // 获取数据库连接
                Connection conn = dbManager.getConnection();
                // 准备SQL语句执行对象
                PreparedStatement pstmt = conn.prepareStatement(sql)
        ) {
            // 设置SQL语句中的玩家UUID参数
            pstmt.setString(1, playerUUID.toString());
            // 执行更新操作，清空玩家的邮箱
            pstmt.executeUpdate();
        } catch (SQLException e) {
            // 打印异常信息，以便于调试和日志记录
            e.printStackTrace();
        }
    }
    /**
     * 关闭资源
     * <p>
     * 本方法用于关闭数据库管理器资源，释放不再需要的数据库连接或资源
     * 通过调用dbManager的close方法来实现资源的清理和释放
     */
    public void close() {
        dbManager.close();
    }

    public Map<Integer, String> getGiftNameCache() {
        return giftNameCache;
    }
}
